<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">

<title>NEWS-2.4.0 - RDoc Documentation</title>


<script src="../js/navigation.js" defer></script>
<script src="../js/search.js" defer></script>
<script src="../js/search_index.js" defer></script>
<script src="../js/searcher.js" defer></script>
<script src="../js/darkfish.js" defer></script>

<script src="../js/jquery-3.2.0.min.js"></script>

<script src="../js/vue.min.js"></script>
<script src="../js/js.cookie.min.js"></script>

<link href="../css/fonts.css" rel="stylesheet">
<link id='rdoccss' href="../css/rdoc.css" rel="stylesheet">
<link href="../css/carbon17.css" rel="stylesheet">

<script type="text/javascript">
  var rdoc_rel_prefix = "../";
  var index_rel_prefix = "../";
  var darkModeCsseHref = "../css/rdoc-dm.css"
  var defaultModeCssHref = "../css/rdoc.css"
  // var cssDarkmode = Cookies.get('darkmode');
  
  if( Cookies.get("darkmode") == "true") {
	$('#rdoccss').attr("href", darkModeCsseHref);
}

//  https://cssdeck.com/blog/simple-jquery-stylesheet-switcher/

document.write('<style type="text/css">body{display:none}</style>');

</script>


</head>
<body id="top" role="document" class="file">
  <!-- this is page.html -->
  <div id='actionbar' >
    <div class='wrapper mdiv'>
      <ul class='grids g0'></ul>
    </div> 
    <!-- VERSION HEADER for 3.3.0-preview2 NOT FOUND -->
  </div> <!-- end action bar -->


 <div class='wrapper hdiv'>

 


<nav id='vapp' role="navigation">
  <div id="project-navigation">
    <div id="home-section" role="region" title="Quick navigation" class="nav-section">
  <h2><a href="../index.html" rel="home">Home</a></h2>

  <div id="table-of-contents-navigation"  >
    <a href="../table_of_contents.html#pages">Pages</a>
    <a href="../table_of_contents.html#classes">Classes</a>
    <a href="../table_of_contents.html#methods">Methods</a>
  </div>
</div>

    <div id="search-section" role="search" class="project-section initially-hidden">
  <form action="#" method="get" accept-charset="utf-8">
    <div id="search-field-wrapper">
      <input id="search-field" role="combobox" aria-label="Search"
             aria-autocomplete="list" aria-controls="search-results"
             type="text" name="search" placeholder="Search" spellcheck="false"
             title="Type to search, Up and Down to navigate, Enter to load">
    </div>

    <ul id="search-results" aria-label="Search Results"
        aria-busy="false" aria-expanded="false"
        aria-atomic="false" class="initially-hidden"></ul>
  </form>
</div>

  </div>

  
<div class="nav-section">
  <h3>Table of Contents</h3>

  <ul class="link-list" role="directory">
    <li><a href="#label-NEWS+for+Ruby+2.4.0">NEWS for Ruby 2.4.0</a>
    <li><a href="#label-Changes+since+the+2.3.0+release">Changes since the 2.3.0 release</a>
    <li><a href="#label-Language+changes">Language changes</a>
    <li><a href="#label-Core+classes+updates+-28outstanding+ones+only-29">Core classes updates (outstanding ones only)</a>
    <li><a href="#label-Stdlib+updates+-28outstanding+ones+only-29">Stdlib updates (outstanding ones only)</a>
    <li><a href="#label-Compatibility+issues+-28excluding+feature+bug+fixes-29">Compatibility issues (excluding feature bug fixes)</a>
    <li><a href="#label-Stdlib+compatibility+issues+-28excluding+feature+bug+fixes-29">Stdlib compatibility issues (excluding feature bug fixes)</a>
    <li><a href="#label-C+API+updates">C API updates</a>
    <li><a href="#label-Supported+platform+changes">Supported platform changes</a>
    <li><a href="#label-Implementation+improvements">Implementation improvements</a>
    <li><a href="#label-Miscellaneous+changes">Miscellaneous changes</a>
  </ul>
</div>

  <button id='toggleThing' @click="toggleNav()" >Show/hide navigation</button>

  <div id="project-metadata">
   <div :class="isOpen ? 'block' : 'hidden' " id='toggleMe'>
    
<div id="fileindex-section" class="nav-section">
  <h3>Pages</h3>

  <ul class="link-list">
    <li><a href="../NEWS/NEWS-1_8_7.html">NEWS-1.8.7</a>
    <li><a href="../NEWS/NEWS-1_9_1.html">NEWS-1.9.1</a>
    <li><a href="../NEWS/NEWS-1_9_2.html">NEWS-1.9.2</a>
    <li><a href="../NEWS/NEWS-1_9_3.html">NEWS-1.9.3</a>
    <li><a href="../NEWS/NEWS-2_0_0.html">NEWS-2.0.0</a>
    <li><a href="../NEWS/NEWS-2_1_0.html">NEWS-2.1.0</a>
    <li><a href="../NEWS/NEWS-2_2_0.html">NEWS-2.2.0</a>
    <li><a href="../NEWS/NEWS-2_3_0.html">NEWS-2.3.0</a>
    <li><a href="../NEWS/NEWS-2_4_0.html">NEWS-2.4.0</a>
    <li><a href="../NEWS/NEWS-2_5_0.html">NEWS-2.5.0</a>
    <li><a href="../NEWS/NEWS-2_6_0.html">NEWS-2.6.0</a>
    <li><a href="../NEWS/NEWS-2_7_0.html">NEWS-2.7.0</a>
    <li><a href="../NEWS/NEWS-3_0_0_md.html">NEWS-3.0.0</a>
    <li><a href="../NEWS/NEWS-3_1_0_md.html">NEWS-3.1.0</a>
    <li><a href="../NEWS/NEWS-3_2_0_md.html">NEWS-3.2.0</a>
    <li><a href="../bsearch_rdoc.html">bsearch</a>
    <li><a href="../bug_triaging_rdoc.html">bug_triaging</a>
    <li><a href="../case_mapping_rdoc.html">case_mapping</a>
    <li><a href="../character_selectors_rdoc.html">character_selectors</a>
    <li><a href="../command_injection_rdoc.html">command_injection</a>
    <li><a href="../contributing_md.html">contributing</a>
    <li><a href="../contributing/building_ruby_md.html">building_ruby</a>
    <li><a href="../contributing/documentation_guide_md.html">documentation_guide</a>
    <li><a href="../contributing/glossary_md.html">glossary</a>
    <li><a href="../contributing/making_changes_to_ruby_md.html">making_changes_to_ruby</a>
    <li><a href="../contributing/making_changes_to_stdlibs_md.html">making_changes_to_stdlibs</a>
    <li><a href="../contributing/reporting_issues_md.html">reporting_issues</a>
    <li><a href="../contributing/testing_ruby_md.html">testing_ruby</a>
    <li><a href="../dig_methods_rdoc.html">dig_methods</a>
    <li><a href="../distribution_md.html">distribution</a>
    <li><a href="../dtrace_probes_rdoc.html">dtrace_probes</a>
    <li><a href="../encodings_rdoc.html">encodings</a>
    <li><a href="../extension_ja_rdoc.html">extension.ja</a>
    <li><a href="../extension_rdoc.html">extension</a>
    <li><a href="../fiber_md.html">fiber</a>
    <li><a href="../format_specifications_rdoc.html">format_specifications</a>
    <li><a href="../globals_rdoc.html">globals</a>
    <li><a href="../implicit_conversion_rdoc.html">implicit_conversion</a>
    <li><a href="../keywords_rdoc.html">keywords</a>
    <li><a href="../maintainers_md.html">maintainers</a>
    <li><a href="../marshal_rdoc.html">marshal</a>
    <li><a href="../memory_view_md.html">memory_view</a>
    <li><a href="../optparse/argument_converters_rdoc.html">argument_converters</a>
    <li><a href="../optparse/creates_option_rdoc.html">creates_option</a>
    <li><a href="../optparse/option_params_rdoc.html">option_params</a>
    <li><a href="../optparse/tutorial_rdoc.html">tutorial</a>
    <li><a href="../packed_data_rdoc.html">packed_data</a>
    <li><a href="../ractor_md.html">ractor</a>
    <li><a href="../regexp_rdoc.html">regexp</a>
    <li><a href="../regexp/methods_rdoc.html">methods</a>
    <li><a href="../regexp/unicode_properties_rdoc.html">unicode_properties</a>
    <li><a href="../ruby_3_3_0_preview2/COPYING.html">COPYING</a>
    <li><a href="../ruby_3_3_0_preview2/COPYING_ja.html">COPYING.ja</a>
    <li><a href="../ruby_3_3_0_preview2/LEGAL.html">LEGAL</a>
    <li><a href="../ruby_3_3_0_preview2/NEWS_md.html">NEWS</a>
    <li><a href="../ruby_3_3_0_preview2/README_ja_md.html">README.ja</a>
    <li><a href="../ruby_3_3_0_preview2/README_md.html">README</a>
    <li><a href="../security_rdoc.html">security</a>
    <li><a href="../signals_rdoc.html">signals</a>
    <li><a href="../standard_library_rdoc.html">standard_library</a>
    <li><a href="../strftime_formatting_rdoc.html">strftime_formatting</a>
    <li><a href="../syntax_rdoc.html">syntax</a>
    <li><a href="../syntax/assignment_rdoc.html">assignment</a>
    <li><a href="../syntax/calling_methods_rdoc.html">calling_methods</a>
    <li><a href="../syntax/comments_rdoc.html">comments</a>
    <li><a href="../syntax/control_expressions_rdoc.html">control_expressions</a>
    <li><a href="../syntax/exceptions_rdoc.html">exceptions</a>
    <li><a href="../syntax/literals_rdoc.html">literals</a>
    <li><a href="../syntax/methods_rdoc.html">methods</a>
    <li><a href="../syntax/miscellaneous_rdoc.html">miscellaneous</a>
    <li><a href="../syntax/modules_and_classes_rdoc.html">modules_and_classes</a>
    <li><a href="../syntax/pattern_matching_rdoc.html">pattern_matching</a>
    <li><a href="../syntax/precedence_rdoc.html">precedence</a>
    <li><a href="../syntax/refinements_rdoc.html">refinements</a>
    <li><a href="../timezones_rdoc.html">timezones</a>
    <li><a href="../windows_md.html">windows</a>
    <li><a href="../yjit/yjit_md.html">yjit</a>
    <li><a href="../yjit/yjit_hacking_md.html">yjit_hacking</a>
  </ul>
</div>

   </div>
  </div>
</nav>


<!--  carbon ads here -->

<div id='extraz'>
  <div class='adzbox-index'  >
   
  </div>
 </div>         


<main role="main" aria-label="Page NEWS/NEWS-2.4.0">

<h1 id="label-NEWS+for+Ruby+2.4.0"><a href="../ruby_3_3_0_preview2/NEWS_md.html">NEWS</a> for Ruby 2.4.0<span><a href="#label-NEWS+for+Ruby+2.4.0">&para;</a> <a href="#top">&uarr;</a></span></h1>

<p>This document is a list of user visible feature changes made between releases except for bug fixes.</p>

<p>Note that each entry is kept so brief that no reason behind or reference information is supplied with.  For a full list of changes with all sufficient information, see the ChangeLog file or Redmine (e.g. <code>https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER</code>)</p>

<h2 id="label-Changes+since+the+2.3.0+release">Changes since the 2.3.0 release<span><a href="#label-Changes+since+the+2.3.0+release">&para;</a> <a href="#top">&uarr;</a></span></h2>

<h3 id="label-Language+changes">Language changes<span><a href="#label-Language+changes">&para;</a> <a href="#top">&uarr;</a></span></h3>
<ul><li>
<p>Multiple assignment in conditional expression is now allowed.  [Feature #10617]</p>
</li><li>
<p>Refinements is enabled at method by <a href="../Symbol.html#method-i-to_proc"><code>Symbol#to_proc</code></a>.  [Feature #9451]</p>
</li><li>
<p>Refinements is enabled with Kernel#send and BasicObject#__send__.  [Feature #11476]</p>
</li><li>
<p>Rescue modifier now applicable to method arguments.  [Feature #12686]</p>
</li><li>
<p>Toplevel return is now allowed.  [Feature #4840]</p>
</li></ul>

<h3 id="label-Core+classes+updates+-28outstanding+ones+only-29">Core classes updates (outstanding ones only)<span><a href="#label-Core+classes+updates+-28outstanding+ones+only-29">&para;</a> <a href="#top">&uarr;</a></span></h3>
<ul><li>
<p><a href="../Array.html"><code>Array</code></a></p>
<ul><li>
<p><a href="../Array.html#method-i-concat"><code>Array#concat</code></a> [Feature #12333]</p>

<p>Now takes multiple arguments.</p>
</li><li>
<p><a href="../Array.html#method-i-max"><code>Array#max</code></a> and <a href="../Array.html#method-i-min"><code>Array#min</code></a>.  [Feature #12172]</p>

<p>This may cause a tiny incompatibility: if you redefine <a href="../Enumerable.html#method-i-max"><code>Enumerable#max</code></a> and call max to an <a href="../Array.html"><code>Array</code></a>, your redefinition will be now ignored.  You should also redefine <a href="../Array.html#method-i-max"><code>Array#max</code></a>.</p>
</li><li>
<p><a href="../Array.html#method-i-pack"><code>Array#pack</code></a> [Feature #12754]</p>

<p>Now takes optional argument ‘buffer:’ to reuse already allocated buffer.</p>
</li><li>
<p><a href="../Array.html#method-i-sum"><code>Array#sum</code></a>  [Feature #12217]</p>

<p>This is different from <a href="../Enumerable.html#method-i-sum"><code>Enumerable#sum</code></a> in that <a href="../Array.html#method-i-sum"><code>Array#sum</code></a> doesn’t depend on the definition of each method.</p>
</li></ul>
</li><li>
<p><a href="../Comparable.html"><code>Comparable</code></a></p>
<ul><li>
<p><a href="../Comparable.html#method-i-clamp"><code>Comparable#clamp</code></a>.  [Feature #10594]</p>
</li></ul>
</li><li>
<p><a href="../Dir.html"><code>Dir</code></a></p>
<ul><li>
<p><a href="../Dir.html#method-c-empty-3F"><code>Dir.empty?</code></a>.  [Feature #10121]</p>
</li></ul>
</li><li>
<p><a href="../Enumerable.html"><code>Enumerable</code></a></p>
<ul><li>
<p><a href="../Enumerable.html#method-i-chunk"><code>Enumerable#chunk</code></a> called without a block now return an <a href="../Enumerator.html"><code>Enumerator</code></a>  [Feature #2172]</p>
</li><li>
<p><a href="../Enumerable.html#method-i-sum"><code>Enumerable#sum</code></a>  [Feature #12217]</p>
</li><li>
<p><a href="../Enumerable.html#method-i-uniq"><code>Enumerable#uniq</code></a>  [Feature #11090]</p>
</li></ul>
</li><li>
<p><a href="../Enumerator/Lazy.html"><code>Enumerator::Lazy</code></a></p>
<ul><li>
<p><a href="../Enumerator/Lazy.html#method-i-chunk_while"><code>Enumerator::Lazy#chunk_while</code></a>  [GH-1186]</p>
</li><li>
<p><a href="../Enumerator/Lazy.html#method-i-uniq"><code>Enumerator::Lazy#uniq</code></a>  [Feature #11090]</p>
</li></ul>
</li><li>
<p><a href="../File.html"><code>File</code></a></p>
<ul><li>
<p><a href="../File.html#method-c-empty-3F"><code>File.empty?</code></a>.  [Feature #9969]</p>
</li></ul>
</li><li>
<p><a href="../Float.html"><code>Float</code></a></p>
<ul><li>
<p><a href="../Float.html#method-i-ceil"><code>Float#ceil</code></a>, <a href="../Float.html#method-i-floor"><code>Float#floor</code></a>, and <a href="../Float.html#method-i-truncate"><code>Float#truncate</code></a> now take an optional digits, as well as <a href="../Float.html#method-i-round"><code>Float#round</code></a>.  [Feature #12245]</p>
</li><li>
<p><a href="../Float.html#method-i-round"><code>Float#round</code></a> now takes an optional keyword argument, half option, and the default behavior is round-up.  [Bug #12548] [Bug #12958] half option can be one of :even, :up, and :down.  [Feature #12953]</p>
</li></ul>
</li><li>
<p><a href="../Hash.html"><code>Hash</code></a></p>
<ul><li>
<p><a href="../Hash.html#method-i-compact"><code>Hash#compact</code></a> and <a href="../Hash.html#method-i-compact-21"><code>Hash#compact!</code></a>  [Feature #11818]</p>
</li><li>
<p><a href="../Hash.html#method-i-transform_values"><code>Hash#transform_values</code></a> and <a href="../Hash.html#method-i-transform_values-21"><code>Hash#transform_values!</code></a>  [Feature #12512]</p>
</li></ul>
</li><li>
<p><a href="../Integer.html"><code>Integer</code></a></p>
<ul><li>
<p>Fixnum and Bignum are unified into <a href="../Integer.html"><code>Integer</code></a>  [Feature #12005]</p>
</li><li>
<p><a href="../Integer.html#method-i-ceil"><code>Integer#ceil</code></a>, <a href="../Integer.html#method-i-floor"><code>Integer#floor</code></a>, and <a href="../Integer.html#method-i-truncate"><code>Integer#truncate</code></a> now take an optional digits, as well as <a href="../Integer.html#method-i-round"><code>Integer#round</code></a>.  [Feature #12245]</p>
</li><li>
<p><a href="../Integer.html#method-i-digits"><code>Integer#digits</code></a> for extracting columns of place-value notation [Feature #12447]</p>
</li><li>
<p><a href="../Integer.html#method-i-round"><code>Integer#round</code></a> now takes an optional keyword argument, half option, and the default behavior is round-up now.  [Bug #12548] [Bug #12958]</p>

<p>half option can be one of :even, :up, and :down.  [Feature #12953]</p>
</li></ul>
</li><li>
<p><a href="../IO.html"><code>IO</code></a></p>
<ul><li>
<p><a href="../IO.html#method-i-gets"><code>IO#gets</code></a>, <a href="../IO.html#method-i-readline"><code>IO#readline</code></a>, <a href="../IO.html#method-i-each_line"><code>IO#each_line</code></a>, <a href="../IO.html#method-i-readlines"><code>IO#readlines</code></a>, <a href="../IO.html#method-c-foreach"><code>IO.foreach</code></a> now takes an optional keyword argument, chomp flag.  [Feature #12553]</p>
</li></ul>
</li><li>
<p><a href="../Kernel.html"><code>Kernel</code></a></p>
<ul><li>
<p><a href="../Kernel.html#method-i-clone"><code>Kernel#clone</code></a> now takes an optional keyword argument, freeze flag.  [Feature #12300]</p>
</li></ul>
</li><li>
<p><a href="../MatchData.html"><code>MatchData</code></a></p>
<ul><li>
<p><a href="../MatchData.html#method-i-named_captures"><code>MatchData#named_captures</code></a> [Feature #11999]</p>
</li><li>
<p><a href="../MatchData.html#method-i-values_at"><code>MatchData#values_at</code></a> supports named captures [Feature #9179]</p>
</li></ul>
</li><li>
<p><a href="../Module.html"><code>Module</code></a></p>
<ul><li>
<p><a href="../Module.html#method-i-refine"><code>Module#refine</code></a> accepts a module as the argument now. [Feature #12534]</p>
</li><li>
<p><a href="../Module.html#method-c-used_modules"><code>Module.used_modules</code></a> [Feature #7418]</p>
</li></ul>
</li><li>
<p><a href="../Numeric.html"><code>Numeric</code></a></p>
<ul><li>
<p><a href="../Numeric.html#method-i-finite-3F"><code>Numeric#finite?</code></a>, <a href="../Numeric.html#method-i-infinite-3F"><code>Numeric#infinite?</code></a> [Feature #12039]</p>
</li></ul>
</li><li>
<p><a href="../Process.html"><code>Process</code></a></p>
<ul><li>
<p>Support CLOCK_MONOTONIC_RAW_APPROX, CLOCK_UPTIME_RAW, and CLOCK_UPTIME_RAW_APPROX which are introduced by macOS 10.12.</p>
</li></ul>
</li><li>
<p><a href="../Rational.html"><code>Rational</code></a></p>
<ul><li>
<p><a href="../Rational.html#method-i-round"><code>Rational#round</code></a> now takes an optional keyword argument, half option, and the default behavior is round-up now.  [Bug #12548] [Bug #12958] half option can be one of :even, :up, and :down.  [Feature #12953]</p>
</li></ul>
</li><li>
<p><a href="../Regexp.html"><code>Regexp</code></a></p>
<ul><li>
<p>meta character X matches Unicode 9.0 characters with some workarounds for UTR #51 Unicode Emoji, Version 4.0 emoji zwj sequences.</p>
</li><li>
<p><a href="../Regexp.html#method-i-match-3F"><code>Regexp#match?</code></a> [Feature #8110]</p>

<p>This returns bool and doesn’t save backref.</p>
</li><li>
<p>Update to Onigmo 6.0.0.</p>
</li></ul>
</li><li>
<p>Regexp/String: Update Unicode version from 8.0.0 to 9.0.0 [Feature #12513]</p>
</li><li>
<p>RubyVM::Env</p>
<ul><li>
<p>RubyVM::Env was removed.</p>
</li></ul>
</li><li>
<p><a href="../String.html"><code>String</code></a></p>
<ul><li>
<p><a href="../String.html#method-i-casecmp-3F"><code>String#casecmp?</code></a> [Feature #12786]</p>
</li><li>
<p><a href="../String.html#method-i-concat"><code>String#concat</code></a>, <a href="../String.html#method-i-prepend"><code>String#prepend</code></a> [Feature #12333]</p>

<p>Now takes multiple arguments.</p>
</li><li>
<p><a href="../String.html#method-i-each_line"><code>String#each_line</code></a>, <a href="../String.html#method-i-lines"><code>String#lines</code></a> now takes an optional keyword argument, chomp flag.  [Feature #12553]</p>
</li><li>
<p><a href="../String.html#method-i-match-3F"><code>String#match?</code></a> [Feature #12898]</p>
</li><li>
<p><a href="../String.html#method-i-unpack1"><code>String#unpack1</code></a> [Feature #12752]</p>
</li><li>
<p><a href="../String.html#method-i-upcase"><code>String#upcase</code></a>, <a href="../String.html#method-i-downcase"><code>String#downcase</code></a>, <a href="../String.html#method-i-capitalize"><code>String#capitalize</code></a>, <a href="../String.html#method-i-swapcase"><code>String#swapcase</code></a> and their bang variants work for all of Unicode, and are no longer limited to ASCII. Supported encodings are UTF-8, UTF-16BE/LE, UTF-32BE/LE, and ISO-8859-1~16. Variations are available with options. See the documentation of <a href="../String.html#method-i-downcase"><code>String#downcase</code></a> for details. [Feature #10085]</p>
</li><li>
<p><a href="../String.html#method-c-new"><code>String.new</code></a>(capacity: size) [Feature #12024]</p>
</li></ul>
</li><li>
<p>StringIO</p>
<ul><li>
<p>StringIO#gets, StringIO#readline, StringIO#each_line, StringIO#readlines now takes an optional keyword argument, chomp flag.  [Feature #12553]</p>
</li></ul>
</li><li>
<p><a href="../Symbol.html"><code>Symbol</code></a></p>
<ul><li>
<p><a href="../Symbol.html#method-i-casecmp-3F"><code>Symbol#casecmp?</code></a> [Feature #12786]</p>
</li><li>
<p><a href="../Symbol.html#method-i-match"><code>Symbol#match</code></a> now returns <a href="../MatchData.html"><code>MatchData</code></a>.  [Bug #11991]</p>
</li><li>
<p><a href="../Symbol.html#method-i-match-3F"><code>Symbol#match?</code></a> [Feature #12898]</p>
</li><li>
<p><a href="../Symbol.html#method-i-upcase"><code>Symbol#upcase</code></a>, <a href="../Symbol.html#method-i-downcase"><code>Symbol#downcase</code></a>, <a href="../Symbol.html#method-i-capitalize"><code>Symbol#capitalize</code></a>, and <a href="../Symbol.html#method-i-swapcase"><code>Symbol#swapcase</code></a> now work for all of Unicode. See the documentation of <a href="../String.html#method-i-downcase"><code>String#downcase</code></a> for details. [Feature #10085]</p>
</li></ul>
</li><li>
<p><a href="../Thread.html"><code>Thread</code></a></p>
<ul><li>
<p><a href="../Thread.html#method-i-report_on_exception"><code>Thread#report_on_exception</code></a> and <a href="../Thread.html#method-c-report_on_exception"><code>Thread.report_on_exception</code></a> [Feature #6647]</p>
</li></ul>
</li><li>
<p><a href="../TracePoint.html"><code>TracePoint</code></a></p>
<ul><li>
<p><a href="../TracePoint.html#method-i-callee_id"><code>TracePoint#callee_id</code></a> [Feature #12747]</p>
</li></ul>
</li><li>
<p><a href="../Warning.html"><code>Warning</code></a></p>
<ul><li>
<p>New module named <a href="../Warning.html"><code>Warning</code></a> is introduced.  By default it has only one singleton method, named warn.  This makes it possible for 3rd-party libraries to control the way warnings are handled. [Feature #12299]</p>
</li></ul>
</li></ul>

<h3 id="label-Stdlib+updates+-28outstanding+ones+only-29">Stdlib updates (outstanding ones only)<span><a href="#label-Stdlib+updates+-28outstanding+ones+only-29">&para;</a> <a href="#top">&uarr;</a></span></h3>
<ul><li>
<p>CGI</p>
<ul><li>
<p>Don’t allow , as a separator [Bug #12791]</p>
</li></ul>
</li><li>
<p>CSV</p>
<ul><li>
<p>Add a liberal_parsing option. [Feature #11839]</p>
</li></ul>
</li><li>
<p>IPAddr</p>
<ul><li>
<p>IPAddr#== and IPAddr#&lt;=&gt; no longer raise an exception if coercion fails. [Bug #12799]</p>
</li></ul>
</li><li>
<p>IRB</p>
<ul><li>
<p>Binding#irb: Start a REPL session like ‘binding.pry` at r56624.</p>
</li></ul>
</li><li>
<p>Logger</p>
<ul><li>
<p>Allow specifying logger parameters in constructor such as level, progname, datetime_format, formatter. [Feature #12224]</p>
</li><li>
<p>Add shift_period_suffix option. [Feature #10772]</p>
</li></ul>
</li><li>
<p>Net::HTTP</p>
<ul><li>
<p>New method: Net::HTTP.post [Feature #12375]</p>
</li></ul>
</li><li>
<p>Net::FTP</p>
<ul><li>
<p>Support TLS (RFC 4217).</p>
</li><li>
<p>Support hash style options for Net::FTP.new.</p>
</li><li>
<p>Add a new optional argument pathname to Net::FTP#status. Contributed by soleboxy. [GH-1478] [Feature #12965]</p>
</li></ul>
</li><li>
<p>OpenSSL</p>
<ul><li>
<p>Includes Ruby/OpenSSL 2.0. OpenSSL has been extracted as a Gem and is maintained at a separate repository now: <a href="https://github.com/ruby/openssl">github.com/ruby/openssl</a>. It still remains as a ‘default gem’.  [Feature #9612] Refer to ext/openssl/History.md for the full release note.</p>
</li></ul>
</li><li>
<p>optparse</p>
<ul><li>
<p>Add an into option. [Feature #11191]</p>
</li></ul>
</li><li>
<p>pathname</p>
<ul><li>
<p>New method: Pathname#empty? [Feature #12596]</p>
</li></ul>
</li><li>
<p>Readline</p>
<ul><li>
<p>Readline.quoting_detection_proc and Readline.quoting_detection_proc= [Feature #12659]</p>
</li></ul>
</li><li>
<p>REXML</p>
<ul><li>
<p>REXML::Element#[]: If <a href="../String.html"><code>String</code></a> or <a href="../Symbol.html"><code>Symbol</code></a> is specified, attribute value is returned. Otherwise, Nth child is returned. This is backward compatible change.</p>
</li></ul>
</li><li>
<p>set</p>
<ul><li>
<p>New methods: Set#compare_by_identity and Set#compare_by_identity?. [Feature #12210]</p>
</li></ul>
</li><li>
<p>WEBrick</p>
<ul><li>
<p>Don’t allow , as a separator [Bug #12791]</p>
</li></ul>
</li></ul>

<h3 id="label-Compatibility+issues+-28excluding+feature+bug+fixes-29">Compatibility issues (excluding feature bug fixes)<span><a href="#label-Compatibility+issues+-28excluding+feature+bug+fixes-29">&para;</a> <a href="#top">&uarr;</a></span></h3>
<ul><li>
<p><a href="../Array.html#method-i-sum"><code>Array#sum</code></a> and <a href="../Enumerable.html#method-i-sum"><code>Enumerable#sum</code></a> are implemented.  [Feature #12217]</p>

<p>Ruby itself has no compatibility problem because Ruby didn’t have sum method for arrays before Ruby 2.4. However many third party gems, activesupport, facets, simple_stats, etc, defines sum method.  These implementations are mostly compatible but there are subtle differences. Ruby’s sum method should be mostly compatible but it is impossible to be perfectly compatible with all of them.</p>
</li><li>
<p>Fixnum and Bignum are unified into <a href="../Integer.html"><code>Integer</code></a>  [Feature #12005]</p>

<p>Fixnum class and Bignum class is removed. <a href="../Integer.html"><code>Integer</code></a> class is changed from abstract class to concrete class. For example, 0 is an instance of Integer: 0.class returns <a href="../Integer.html"><code>Integer</code></a>. The constants Fixnum and Bignum is bound to <a href="../Integer.html"><code>Integer</code></a>. So obj.kind_of?(Fixnum) works as obj.kind_of?(<a href="../Integer.html"><code>Integer</code></a>). At C-level, Fixnum object and Bignum object should be distinguished by FIXNUM_P(obj) and RB_TYPE_P(obj, T_BIGNUM). RUBY_INTEGER_UNIFICATION can be used to detect this feature at C-level. 0.class == <a href="../Integer.html"><code>Integer</code></a> can be used to detect this feature at Ruby-level. The C-level constants, rb_cFixnum and rb_cBignum, are removed. They can cause compilation failure.</p>
</li><li>
<p>String/Symbol#upcase/downcase/swapcase/capitalize(!) now work for all of Unicode, not only for ASCII. [Feature #10085]</p>

<p>No change is needed if the data is in ASCII anyway or if the limitation to ASCII was only tolerated while waiting for a more extensive implementation. A change (using the :ascii option) is needed in cases where Unicode data is processed, but the operation has to be limited to ASCII only. A good example of this are internationalized domain names.</p>
</li><li>
<p>TRUE / FALSE / NIL</p>

<p>These constants are now obsoleted. [Feature #12574] Use true / false / nil resp. instead.</p>
</li></ul>

<h3 id="label-Stdlib+compatibility+issues+-28excluding+feature+bug+fixes-29">Stdlib compatibility issues (excluding feature bug fixes)<span><a href="#label-Stdlib+compatibility+issues+-28excluding+feature+bug+fixes-29">&para;</a> <a href="#top">&uarr;</a></span></h3>
<ul><li>
<p>DateTime</p>
<ul><li>
<p>DateTime#to_time now preserves timezone.  [Bug #12189]</p>
</li></ul>
</li><li>
<p>Psych</p>
<ul><li>
<p>Update to Psych 2.2.2</p>
</li></ul>
</li><li>
<p><a href="../RDoc.html"><code>RDoc</code></a></p>
<ul><li>
<p>Update to <a href="../RDoc.html"><code>RDoc</code></a> 5.0.0</p>
</li></ul>
</li><li>
<p>RubyGems</p>
<ul><li>
<p>Update to RubyGems 2.6.8</p>
</li></ul>
</li><li>
<p>shellwords</p>
<ul><li>
<p>Shellwords.shellwords (shellsplit) treats the backslash as escape character only when followed by one of the following characters: $ ‘ “ \ &lt;newline&gt; [Bug #10055]</p>
</li></ul>
</li><li>
<p><a href="../Time.html"><code>Time</code></a></p>
<ul><li>
<p>Time#to_time now preserves timezone.  [Bug #12271]</p>
</li></ul>
</li><li>
<p>thread</p>
<ul><li>
<p>the extension library is removed.  Till 2.0 it was a pure ruby script “thread.rb”, which has precedence over “thread.so”, and has been provided in $LOADED_FEATURES since 2.1.</p>
</li></ul>
</li><li>
<p>Tk</p>
<ul><li>
<p>Tk is removed from stdlib.  [Feature #8539]</p>

<p><a href="https://github.com/ruby/tk">github.com/ruby/tk</a> is the new upstream.</p>
</li></ul>
</li><li>
<p>XMLRPC</p>
<ul><li>
<p>XMLRPC is removed from stdlib, and bundled as gem. [Feature #<a href="ruby-core:74239">12160]</a></p>

<p><a href="https://github.com/ruby/xmlrpc">github.com/ruby/xmlrpc</a> is the new upstream.</p>
</li></ul>
</li><li>
<p>Zlib</p>
<ul><li>
<p>Zlib.gzip and Zlib.gunzip [Feature #13020]</p>
</li></ul>
</li></ul>

<h3 id="label-C+API+updates">C API updates<span><a href="#label-C+API+updates">&para;</a> <a href="#top">&uarr;</a></span></h3>
<ul><li>
<p>ruby_show_version() will no longer exits the process, if RUBY_SHOW_COPYRIGHT_TO_DIE is set to 0.  This will be the default in the future.</p>
</li><li>
<p>rb_gc_adjust_memory_usage() [Feature #12690]</p>
</li></ul>

<h3 id="label-Supported+platform+changes">Supported platform changes<span><a href="#label-Supported+platform+changes">&para;</a> <a href="#top">&uarr;</a></span></h3>
<ul><li>
<p>FreeBSD &lt; 4 is no longer supported</p>
</li></ul>

<h3 id="label-Implementation+improvements">Implementation improvements<span><a href="#label-Implementation+improvements">&para;</a> <a href="#top">&uarr;</a></span></h3>
<ul><li>
<p>In some condition, ‘[x, y].max` and `[x, y].min` are optimized so that a temporal array is not created.  The concrete condition is an implementation detail: currently, the array literal must have no splat, must have at least one expression but literal, the length must be &lt;= 0x100, and <a href="../Array.html#method-i-max"><code>Array#max</code></a> and min must not be redefined.  It will work in most casual and real-life use case where it is written with intent to `Math.max(x, y)`.</p>
</li><li>
<p><a href="../Thread.html"><code>Thread</code></a> deadlock detection now shows their backtrace and dependency. [Feature #8214]</p>
</li><li>
<p>st_table (st.c) internal data structure is improved. [Feature #12142]</p>
</li><li>
<p><a href="../Rational.html"><code>Rational</code></a> is extensively optimized. [Feature #12484]</p>
</li></ul>

<h3 id="label-Miscellaneous+changes">Miscellaneous changes<span><a href="#label-Miscellaneous+changes">&para;</a> <a href="#top">&uarr;</a></span></h3>
<ul><li>
<p>ChangeLog is removed from the repository.</p>

<p>It is generated from commit messages in Subversion by ‘make dist`. Also note that now people should follow Git style commit message. The template is written at <a href="https://git-scm.com/book/ch5-2.html">Short (50 chars or less) summary of changes</a>.  [Feature #12283]</p>
</li></ul>

</main>

</div>  <!--  class='wrapper hdiv' -->


<footer id="validator-badges" role="contentinfo">
<p><a href="https://validator.w3.org/check/referer">Validate</a></p>
<p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.4.0.</p>
<p>Based on <a href="https://github.com/ged/darkfish/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.</p>

  
    <p><p><a href="https://ruby-doc.org">Ruby-doc.org</a> is provided by <a href="https://jamesbritt.com">James Britt</a> and <a href="https://neurogami.com">Neurogami</a>. </p><p><a href="https://jamesbritt.bandcamp.com/">Hack your world.  Feed your head.  Live curious</a>.</p>
</p>
  
  </footer>

<script type="text/javascript">


  let ads  = $("#carbonads-container").children().detach();


  function swapMode() {
    var cookieName = 'darkmode';
    var cssDarkmode = Cookies.get(cookieName);
    console.log("***** swapMode! " + cssDarkmode + " *****");


    if (cssDarkmode == "true") {
      console.log("We have dark mode, set the css to light ...");
      $('#rdoccss').attr("href", defaultModeCssHref);
      $('#cssSelect').text("Dark mode");
      cssDarkmode = "false";
      console.log("swapMode! Now set cookie to " + cssDarkmode);
      Cookies.set(cookieName, cssDarkmode);

    } else {
      console.log("We not have dark mode, set the css to dark ...");
      $('#rdoccss').attr("href", darkModeCsseHref);
      $('#cssSelect').text("Light mode");
      cssDarkmode = "true";
      console.log("swapMode! Now set cookie to " + cssDarkmode);
      Cookies.set(cookieName, cssDarkmode);

    }

    console.log("  --------------- ");
  }


const vueCssApp = new Vue({
el: '#menubar',
data: {
isDark: false
},
methods: {
toggleClass: function(event){
this.isDark = !this.isDark;
}
}
})

const vueApp = new Vue({
el: '#vapp',
data: { 
isOpen: true
},

mounted() {
this.handleResize();
this.manage_mob_classes();
window.addEventListener('resize', this.handleResize)
//this.isOpen !=  (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));
},
destroyed() {
window.removeEventListener('resize', this.handleResize)
},
created() {
//manage_mob_classes();
},

methods : {
isMobile() {
  return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));
},

  handleResize() {
    if (!this.isMobile()) {
      this.isOpen = window.innerWidth > 800;
    }
  },

  manage_mob_classes() {
    if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
      $("nav").addClass("mob_nav");
      $("main").addClass("mob_main");
      $("#extraz").addClass("mob_extraz");
      $("#carbonads-container").addClass("mob_carbonads-container");
      this.isOpen  = false;
    } else {
      $("nav").removeClass("mob_nav") 
        $("main").removeClass("mob_main");
      $("#extraz").removeClass("mob_extraz");
      $("#carbonads-container").removeClass("mob_carbonads-container");
      this.isOpen  = true;
    }
  },

  toggleNav() {
    this.isOpen =! this.isOpen ;
    // alert("Toggle nav!");
    console.log("toggleNav() click: " + this.isOpen );
  }
}
})

$("#carbonads-container").append(ads);


$(function() {

    var darkmode = Cookies.get("darkmode");
    console.log("Document ready: " + darkmode);

    if ( darkmode  == "true" ) {
      $('#cssSelect').text("Light mode");
    } else {
      $('#cssSelect').text("Dark mode");
     }

    $('body').css('display','block');
    });

</script>

    
  </body> 
</html>

